import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * @author 3489309323@qq.com
 * @create 2020-09-14-23:25
 */
public class P3两任务完成之后再执行第三个 {
  public static ExecutorService executor = Executors.newFixedThreadPool(10);

  public static void main(String[] args) throws ExecutionException, InterruptedException {
    /** 任务3 希望在 前两个任务都完成后再执行*/
    /** future01.runAfterBoth/runAfterBothAsync */
    /*System.out.println("main...start...");

    CompletableFuture<Integer> future01 = CompletableFuture
      .supplyAsync(() -> {
        System.out.println("任务1线程开始");
        int i = 10 / 2;
        //int i = 10 / 0;
        System.out.println("运行结果: " + i);
        System.out.println("任务1线程结束");
        return i;
      }, executor);

    CompletableFuture<String> future02 = CompletableFuture
      .supplyAsync(() -> {
        System.out.println("任务2线程开始");
        System.out.println("任务2线程结束");
        return "Hello";
      }, executor);


    future01.runAfterBothAsync(future02, () -> {
      System.out.println("任务3开始");
    });


    System.out.println("main...end...");*/
/*

如果是 runAfterBothAsync
main...start...
任务1线程开始
运行结果: 5
任务1线程结束
任务2线程开始
任务2线程结束
main...end...
任务3开始

如果是 runAfterBoth
main...start...
任务1线程开始
运行结果: 5
任务1线程结束
任务2线程开始
任务2线程结束
任务3开始
main...end...
* */

    /** future01.thenAcceptBoth/thenAcceptBothAsync */
    /*System.out.println("main...start...");

    CompletableFuture<Integer> future01 = CompletableFuture
      .supplyAsync(() -> {
        System.out.println("任务1线程开始");
        int i = 10 / 2;
        //int i = 10 / 0;
        System.out.println("运行结果: " + i);
        System.out.println("任务1线程结束");
        return i;
      }, executor);

    CompletableFuture<String> future02 = CompletableFuture
      .supplyAsync(() -> {
        System.out.println("任务2线程开始");
        System.out.println("任务2线程结束");
        return "Hello";
      }, executor);


    future01.thenAcceptBoth(future02, (res1,res2) -> {
      System.out.println("任务3开始... 之前的结果： "+res1+","+res2);
    });


    System.out.println("main...end...");*/
/*
如果是 thenAcceptBothAsync
main...start...
任务1线程开始
运行结果: 5
任务1线程结束
任务2线程开始
任务2线程结束
main...end...
任务3开始... 之前的结果： 5,Hello

如果是 thenAcceptBoth
main...start...
任务1线程开始
运行结果: 5
任务1线程结束
任务2线程开始
任务2线程结束
任务3开始... 之前的结果： 5,Hello
main...end...
* */

    /** CompletableFuture<String> future03 = future01.thenCombineAsync
     * future03.get()*/
    System.out.println("main...start...");

    CompletableFuture<Integer> future01 = CompletableFuture
      .supplyAsync(() -> {
        System.out.println("任务1线程开始");
        int i = 10 / 2;
        //int i = 10 / 0;
        System.out.println("运行结果: " + i);
        System.out.println("任务1线程结束");
        return i;
      }, executor);

    CompletableFuture<String> future02 = CompletableFuture
      .supplyAsync(() -> {
        System.out.println("任务2线程开始");
        System.out.println("任务2线程结束");
        return "Hello";
      }, executor);


    CompletableFuture<String> future03 = future01.thenCombineAsync(future02, (res1, res2) -> {
      System.out.println("任务3开始... 之前的结果： " + res1 + "," + res2);
      return "res3";
    }, executor);

    System.out.println(future03.get());
    System.out.println("main...end...");
/*
main...start...
任务1线程开始
运行结果: 5
任务1线程结束
任务2线程开始
任务2线程结束
任务3开始... 之前的结果： 5,Hello
res3
main...end...
* */
  }
}
